/*
 * ContextoPPMC.h
 *
 *  Created on: 28/04/2012
 *      Author: lucas
 */

#ifndef CONTEXTOPPMC_H_
#define CONTEXTOPPMC_H_

#include "../hdr/Vector.h"
#include "../hdr/EmisorAritmetico.h"
#include "../hdr/LectorAritmetico.h"
#include <stdbool.h>

class ContextoPPMC {
public:
	ContextoPPMC();
	virtual ~ContextoPPMC();
	unsigned int getCantidadDeCaracteres();
	unsigned int getCantidadDeCaracteresMenores(unsigned short caracter);
	int emitirProbabilidad(unsigned short caracter, char* proxExclusion, EmisorAritmetico* emisor);
	/* 'caracter' es una direccion de memoria valida para escribir el caracter procesado,
	 * en caso de hallarlo. En 'excluidos' estan los caracteres del contexto superior
	 * que deben ser excluidos en este. */ 
	int emitirCaracter(unsigned char* caracter, Vector<short> *excluidos, 
				Vector<short> **proxExclusion, LectorAritmetico *lector);
	int actualizarContexto(unsigned char caracter);
private:
	Vector<short> caracteres;
	Vector<unsigned char> envejecimiento;
	/* Almacena las frecuencias de ocurrencia de cada "distancia" o "envejecimiento".
	 * Si ocurre algo que hace 3 veces que no ocurria "envejecimiento = 3" => frecPosicion[3]++;
	 */
	Vector<unsigned char> frecPosicion;
	Vector<unsigned char> frecuencias;
	bool debeRenormalizar();
	void renormalizar();
	/* Actualiza los envejecimiento, y agrega un nuevo caracter
	 * en la ultima posicion tomando como que fue lo ultimo que 
	 * ocurrio. */
	void agregarCaracterEnvejecimiento();
	/* Actualiza el envejecimiento, tomando lo apuntado por 
	 * 'posicion' como lo ultimo que ocurrio.
	 * Pre: el vector NO puede estar vacio.
	 * 0 <= posicion < envejecimiento.getLargo() */
	void actualizarEnvejecimiento(int posicion);
	unsigned int getProbabilidad(unsigned int indice);
};

#endif /* CONTEXTOPPMC_H_ */
